package com.manning.readinglist;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;

@Controller
@RequestMapping("/")
// ReadingListController 上加了 @ConfigurationProperties 注解，这说明该 Bean 的属性应该是（通过 setter 方法）从配置属性值注入的。说得更具体一点，prefix 属性说明
// ReadingListController 应该注入带 amazon 前缀的属性。综合起来，我们指定 ReadingListController 的属性应该从带 amazon 前缀的配置属性中进行注入。
// 从技术上来说，@ConfigurationProperties 注解不会生效，除非先向 Spring 配置类添加 @EnableConfigurationProperties 注解。但通常无需这么做，因为 Spring Boot 自动配置后面
// 的全部配置类都已经加上了 @EnableConfigurationProperties 注解。因此，除非你完全不使用自动配置（那怎么可能？），否则就无需显式地添加 @EnableConfigurationProperties。
//@ConfigurationProperties(prefix = "amazon")
public class ReadingListController {

//    private String associateId;

    private ReadingListRepository readingListRepository;

    /**
     * ReadingListController 不再直接加载配置属性，转而通过注入其中的 AmazonProperties Bean 来获取所需的信息。
     */
    private AmazonProperties amazonProperties;

    @Autowired
    public ReadingListController(ReadingListRepository readingListRepository, AmazonProperties amazonProperties) {
        this.readingListRepository = readingListRepository;
        this.amazonProperties = amazonProperties;
    }

//    public void setAssociateId(String associateId) {
//        this.associateId = associateId;
//    }

    @RequestMapping(method = RequestMethod.GET)
    public String readersBooks(Reader reader, Model model) {
        List<Book> readingList = readingListRepository.findByReader(reader);
        if(readingList!=null){
            model.addAttribute("books",readingList);
            model.addAttribute("reader",reader);
            // 将 associateId 放入模型
            // 有了加载 amazon.associateId 配置属性的 AmazonProperties 后，我们可以调整 ReadingListController，让它从注入的 AmazonProperties 中获取
            // Amazon Associate ID。
            model.addAttribute("amazonID",amazonProperties.getAssociateId());
        }
        return "readingList";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String addToReadingList(Reader reader, Book book) {
        book.setReader(reader);
        readingListRepository.save(book);
        return "redirect:/";
    }
}
